宏 LIST_HEAD

初始化一个 list_head 结构

#define LIST_HEAD_INIT(name) { &(name), &(name) }

#define LIST_HEAD(name) \
	struct list_head name = LIST_HEAD_INIT(name)

LIST_HEAD(name) 整个展开后为

struct list_head name = {&(name), &(name)}

这不就是结构体的初始化嘛,相当于创建并初始化 list_head,其 nextprev 均指向 name 本身

详见 宏 LIST_HEAD_INIT

在内核中使用

比如在 drivers/spi/spi.c 中的使用

/**
 * acpi_spi_count_resources - Count the number of SpiSerialBus resources
 * @adev:	ACPI device
 *
 * Returns the number of SpiSerialBus resources in the ACPI-device's
 * resource-list; or a negative error code.
 */
int acpi_spi_count_resources(struct acpi_device *adev)
{
	LIST_HEAD(r);
	int count = 0;
	int ret;

	ret = acpi_dev_get_resources(adev, &r, acpi_spi_count, &count);
	if (ret < 0)
		return ret;

	acpi_dev_free_resource_list(&r);

	return count;
}